package org.jeecg.modules.message.util;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @description: 邮件渲染
 * @author: zwf
 * @create: 2025-05-16 13:02
 **/
public class TemplateUtil {
    private static final Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);

    // 可选：模板缓存（根据业务需求决定是否启用）
    private static final Map<String, Template> templateCache = new ConcurrentHashMap<>();

    static {
        cfg.setDefaultEncoding("UTF-8");
    }

    /**
     * 渲染数据库中的模板
     *
     * @param templateContent 从数据库读取的模板内容
     * @param data            模板变量
     */
    public static String renderFromDb(String templateContent, Map<String, Object> data) {
        try {
            // 生成缓存键（可根据业务需求调整）
            String cacheKey = "db_template_" + templateContent.hashCode();

            Template template;
            if (templateCache.containsKey(cacheKey)) {
                template = templateCache.get(cacheKey);
            } else {
                template = new Template("dbTemplate", new StringReader(templateContent), cfg);
                templateCache.put(cacheKey, template); // 缓存模板
            }

            return processTemplate(template, data);
        } catch (IOException e) {
            throw new RuntimeException("模板解析失败", e);
        }
    }

    private static String processTemplate(Template template, Map<String, Object> data) {
        try (StringWriter writer = new StringWriter()) {
            template.process(data, writer);
            return writer.toString();
        } catch (TemplateException | IOException e) {
            throw new RuntimeException("模板渲染失败", e);
        }
    }

    /**
     * 清除模板缓存（当数据库模板更新时调用）
     */
    public static void clearCache() {
        templateCache.clear();
    }
}
